package com.zzk.work.classloadprocess;

/**
 * @Author wangjinyu@zcunsoft.com
 * @Date 2021-10-20 22:26
 * @Version 1.0
 *
 * <p>
 * JVM几大模块：
 *  1、类加载器子系统
 *  2、内存模型
 *  3、执行引擎
 *  4、垃圾收集器
 *  5、JIT（热点代码缓存）
 *
 *  目的：
 *  1、搞清楚Java代码的运行本质
 *  2、调优秀
 *
 * <p>
 * Klass模型是什么
 * java类在JVM中的存在形式
 * java类->c++的类 klass
 * <p>
 * 非数组
 * InstanceKlass 普通类在JVM中对应的c++类 方法区  类的元信息
 * InstanceMirrorKlass 对应的是Class对象 镜像类  存堆区
 * <p>
 * 数组
 * 基本类型数组
 * boolean byte char short int float long double
 * TypeArrayKlass
 * 引用类型数组
 * ObjArrayKlass
 * <p>
 * 如何通过HSDB查看一个java类对应的c++类
 * 非数组
 * 1、通过类向导
 * 2、通过对象
 * <p>
 * 数组类型
 * 通过堆栈查看jvm中动态类型
 * <p>
 * 常量池
 * 1、静态常量池
 * 2、运行时常量池
 * 3、字符串常量池
 * <p>
 * 解析阶段：符号引用 ->改写-> 直接引用
 * 符号引用：静态常量池索引
 * 直接引用：内存地址
 * <p>
 * 初始化阶段
 * 执行类的静态代码块 clinit
 * 1、如果没有静态属性、静态代码段，生成的字节码文件中就没有clinit方法块
 * 2、final修饰，不会在clinit方法块中体现
 * 3、一个字节码文件只有一个clinit方法块
 * 4、clinit方法块中生成的代码顺序与Java代码的顺序是一致的。这个会影响程序最终结果
 *
 *
 * 初始化阶段的死锁是jvm级别的，检测工具是检测不到的，(检测工具能发现java级别死锁)
 */


public class Hello {

    //初始化赋值给实例
    private int a = 10;
    //准备阶段赋初值给类
    private static int b = 20;
    //准备阶段赋初值给类?
    private static int c;
    //final常量准备阶段直接赋值
    private static final int v = 20;

    public static void main(String[] args) {
        int[] intArr = new int[1];
        Hello[] objArr = new Hello[1];
        Class<Hello> aClass = Hello.class;
        System.out.println(Hello.b);
        Hello hh = new Hello();
        while (true) ;
    }
}
